// 给定一个链表的头节点  head ，返回链表开始入环的第一个节点。 如果链表无环，则返回 null。

// 如果链表中有某个节点，可以通过连续跟踪 next 指针再次到达，则链表中存在环。 为了表示给定链表中的环，评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置（索引从 0 开始）。如果 pos 是 -1，则在该链表中没有环。注意：pos 不作为参数进行传递，仅仅是为了标识链表的实际情况。

// 不允许修改 链表。

// ListNode的定义
// function ListNode(val, next) {
//   this.val = (val===undefined ? 0 : val)
//   this.next = (next===undefined ? null : next)
// }

function detectCycle(head) {
  // 快慢指针
  let fast = head;
  let slow = head;

  while (fast && fast.next) {
    // 快指针每次走两步，慢指针每次走一步
    // 如果有环，快指针最终会追上慢指针
    fast = fast.next.next;
    slow = slow.next;
    // 快指针和慢指针相遇，说明有环
    if (fast === slow) {
      // 快指针从相遇点开始走，慢指针从链表头开始走
      // 再次相遇的点就是环的入口
      fast = head;
      while (fast !== slow) {
        slow = slow.next;
        fast = fast.next;
      }
      return slow;
    }
  }

  return null;
}
